package com.jsejtman.gastos.service.impl;

import com.jsejtman.gastos.persistence.dao.DaoException;
import com.jsejtman.gastos.persistence.dao.UsuarioDao;
import com.jsejtman.gastos.persistence.entity.Usuario;
import com.jsejtman.gastos.service.definition.BaseService;
import com.jsejtman.gastos.service.exception.ServiceException;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * Servicio que permite realizar operaciones con una entidad de datos Entity.
 * 
 * @author jsejtman
 */
@Service
@Transactional
public class UsuarioService extends BaseService implements IUsuarioService {

	/**
	 * Logger de la aplicación.
	 */
	private static final Logger LOGGER = Logger.getLogger(UsuarioService.class);

	/**
	 * Obtiene una entidad de datos Entity a través de su identificador.
	 * 
	 * @param id Identificador de la entidad.
	 * @return Entidad de datos Entity hallada.
	 * @throws ServiceException En caso de problemas.
	 */
	public final Usuario getUsuarioById(final Long id) throws ServiceException {

		if (id == null) {
			throw new ServiceException("El identificador de usuario no fue especificado.");
		}
		try {
			final UsuarioDao entityDao = this.getDaoFactory().newDao(UsuarioDao.class);

			return (entityDao.get(Usuario.class, id));

		} catch (final DaoException e) {
			final String mensajeError =
			        "Error al obtener " + Usuario.class.getName() + " con ID = " + id;

			UsuarioService.LOGGER.error(mensajeError, e);

			throw new ServiceException(mensajeError, e);
		}
	}

	/**
	 * Obtiene una entidad de datos Usuario a través de su nombre de usuario.
	 * 
	 * @param nombreDeUsuario Nombre de usuario.
	 * @return Entidad de datos Usuario hallada.
	 * @throws ServiceException En caso de problemas.
	 */
	public final Usuario getUsuarioByNombreDeUsuario(final String nombreDeUsuario)
	        throws ServiceException {

		if (nombreDeUsuario == null) {
			throw new ServiceException("El identificador de nombreDeUsuario no fue especificado.");
		}
		try {
			final UsuarioDao entityDao = this.getDaoFactory().newDao(UsuarioDao.class);

			return (entityDao.getByNombreDeUsuario(nombreDeUsuario));

		} catch (final DaoException e) {
			final String mensajeError =
			        "Error al obtener " + Usuario.class.getName() + " con nombreDeUsuario = "
			                + nombreDeUsuario;

			UsuarioService.LOGGER.error(mensajeError, e);

			throw new ServiceException(mensajeError, e);
		}
	}

	/**
	 * Graba o actualiza el usuario pasado.
	 * 
	 * @param usuario el usuario a grabar.
	 * @throws ServiceException en caso de problemas
	 */
	public final void saveUsuario(final Usuario usuario) throws ServiceException {

		if (usuario == null) {
			throw new ServiceException("El identificador de usuario no fue especificado.");
		}
		try {
			final UsuarioDao entityDao = this.getDaoFactory().newDao(UsuarioDao.class);

			entityDao.saveOrUpdate(usuario);

		} catch (final DaoException e) {
			final String mensajeError =
			        "Error al grabar " + Usuario.class.getName() + " usuario = " + usuario;

			UsuarioService.LOGGER.error(mensajeError, e);

			throw new ServiceException(mensajeError, e);
		}

	}

	/**
	 * Borra un usuario.
	 * 
	 * @param usuario el usuario a borrar
	 * @throws ServiceException si ocurre un error.
	 */
	public final void deleteUsuario(final Usuario usuario) throws ServiceException {

		if (usuario == null) {
			throw new ServiceException("El identificador de usuario no fue especificado.");
		}
		try {
			final UsuarioDao entityDao = this.getDaoFactory().newDao(UsuarioDao.class);

			entityDao.delete(usuario);

		} catch (final DaoException e) {
			final String mensajeError =
			        "Error al borrar " + Usuario.class.getName() + " usuario = " + usuario;

			UsuarioService.LOGGER.error(mensajeError, e);

			throw new ServiceException(mensajeError, e);
		}
	}

}
